package com.example;

import org.junit.Test;

import java.util.Arrays;

/**
 * 数组
 */
public class Demo02 {

    @Test
    public void test01() {
        /* 8大数据类型也叫基本数据类型 */
        int[] arr1 = new int[10];
        int[] arr2 = new int[]{1, 3, 5, 7, 9};
        int[] arr3 = {2, 4, 6, 8, 10};
        /* 大写开头的类名，通常叫做引用数据类型 */
        String[] arr4 = {"a", "b", "c", "d", "e", "f"};
        Demo02[] demo02 = new Demo02[10];
        // String[] arr5 = {1, 2, "cdf"}; // 数组的元素必须符合定义数组的数据类型
    }

    /* 数组元素赋值 */
    @Test
    public void test02() {
        int[] arr1 = new int[10];
        /* 可以填0-9 */
        arr1[0] = 10; //
        arr1[9] = 1;
        /* 数组越界异常 */
        // arr1[10] = 0;
        System.out.println("数组的容量/长度" + arr1.length); // 10
        // 最大的索引arr1.length - 1
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = 10 - i;
        }
        System.out.println(Arrays.toString(arr1));
    }

    /* 数组元素的默认值 */
    @Test
    public void test03() {
        int[] arr1 = new int[10];
        System.out.println(Arrays.toString(arr1));
        byte[] arr2 = new byte[10];
        System.out.println(Arrays.toString(arr2));
        /* 所有的引用类型的数组元素默认值都是null */
        String[] arr3 = new String[10];
        System.out.println(Arrays.toString(arr3));
    }

    /* 数组元素的访问和数组遍历 */
    @Test
    public void test04() {
        int[] arr1 = new int[10];
        System.out.println(arr1[0]); // 访问单个元素
        int[] arr2 = {80, 90, 70, 76, 83};
        int sum = 0;
        /* 循环访问数组元素，通常叫做遍历 */
        for (int i = 0; i < arr2.length; i++) {
            sum += arr2[i];
        }
        System.out.println("平均分是:" + sum/arr2.length);
        /* 增强for循环 */
        for (int i : arr2) {
            // i：元素本身
            // 输出的顺序：按照索引的升序输出
            System.out.println(i);
        }
    }

    @Test
    public void test05() {
        int[] arr1 = {1, 2, 3};
        int[] arr2 = arr1;
        System.out.println(arr2[1]); // 2
        arr1[1] = 10; // 只是改细节
        System.out.println(arr2[1]); // 10
        arr1 = null; // 整体换了目标
        // System.out.println(arr1[1]); // 报错
        System.out.println(arr2[1]); // 10
    }

    /* 冒泡排序：升序排序 */
    /* 依次取出相邻的2个数比较，如果左边比右边大，则交换顺序 */
    @Test
    public void test06() {
        int[] arr = {13, 20, 8, 5, 2, 17};
        /* 5次循环，比较5轮 */
        for (int i = 0; i < arr.length - 1; i++) {
            /* 首轮比较5次，每轮比较次数依次减1 */
            for (int j = 0; j < arr.length - 1 - i; j++) {
                /* >:升序, <:降序 */
                if (arr[j] > arr[j + 1]) {
                    // 交换
                    // arr[j]原始的数据保留一下
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

    /* 选择排序：升序排序 */
    /* 每一轮选中一个位置，依次与后续的每个元素比较，如果左边比右边大，则交换顺序 */
    @Test
    public void test07() {
        int[] arr = {13, 20, 8, 5, 2, 17};
        /* i：每轮选中的位置 */
        for (int i = 0; i < arr.length - 1; i++) {
            // arr[i]
            /* j每轮都要取到最后一个位置的数 */
            for (int j = i + 1; j < arr.length; j++) {
                // arr[j]
                /* >:升序, <:降序 */
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}
